package com.lframework.xingyun.basedata.bo.coupon;

import com.fasterxml.jackson.annotation.JsonFormat;
import java.math.BigDecimal;
import com.lframework.starter.common.constants.StringPool;
import com.lframework.starter.web.core.bo.BaseBo;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

import com.lframework.starter.web.core.utils.ApplicationUtil;
import com.lframework.xingyun.basedata.entity.Coupon;
import com.lframework.xingyun.basedata.service.coupon.CouponProductService;
import com.lframework.xingyun.basedata.service.coupon.CouponStopService;
import com.lframework.xingyun.basedata.vo.coupon.QueryCouponProductVo;
import com.lframework.xingyun.basedata.vo.coupon.QueryCouponStopVo;
import io.swagger.annotations.ApiModelProperty;

import lombok.Data;

/**
 * <p>
 * 卡券信息 QueryBo
 * </p>
 *
 */
@Data
public class QueryCouponBo extends BaseBo<Coupon> {

    /**
     * ID
     */
    @ApiModelProperty("ID")
    private String id;

    /**
     * 创建人
     */
    @ApiModelProperty("创建人")
    private String createBy;

    /**
     * 创建人ID
     */
    @ApiModelProperty("创建人ID")
    private String createById;

    /**
     * 创建时间
     */
    @ApiModelProperty("创建时间")
    @JsonFormat(pattern = StringPool.DATE_TIME_PATTERN)
    private LocalDateTime createTime;

    /**
     * 修改人
     */
    @ApiModelProperty("修改人")
    private String updateBy;

    /**
     * 修改人ID
     */
    @ApiModelProperty("修改人ID")
    private String updateById;

    /**
     * 修改时间
     */
    @ApiModelProperty("修改时间")
    @JsonFormat(pattern = StringPool.DATE_TIME_PATTERN)
    private LocalDateTime updateTime;

    /**
     * 卡券类型
     */
    @ApiModelProperty("卡券类型")
    private Integer couponType;

    /**
     * 卡券名称
     */
    @ApiModelProperty("卡券名称")
    private String couponName;

    /**
     * 发放方式
     */
    @ApiModelProperty("发放方式")
    private Integer sendWay;

    /**
     * 有效天数
     */
    @ApiModelProperty("有效天数")
    private Integer effectiveDay;

    /**
     * 状态
     */
    @ApiModelProperty("状态")
    private Boolean available;

    /**
     * 备注
     */
    @ApiModelProperty("备注")
    private String description;

    /**
     * 面值
     */
    @ApiModelProperty("面值")
    private BigDecimal parValue;

    /**
     * 增值比例
     */
    @ApiModelProperty("增值比例")
    private BigDecimal added;

    /**
     * 使用条件
     */
    @ApiModelProperty("使用条件")
    private BigDecimal useCondition;

    /**
     * 售价
     */
    @ApiModelProperty("售价")
    private BigDecimal price;

    /**
     * 是否全部商品可用
     */
    @ApiModelProperty("是否全部商品可用")
    private Boolean productAll;

    /**
     * 商品ID列表
     */
    @ApiModelProperty("商品ID列表")
    private List<String> productIds;

    /**
     * 商品信息
     */
    @ApiModelProperty("商品信息")
    private List<QueryCouponProductBo> products;

    /**
     * 是否全部门店可用
     */
    @ApiModelProperty("是否全部门店可用")
    private Boolean stopAll;

    /**
     * 门店ID列表
     */
    @ApiModelProperty("门店ID列表")
    private List<String> shopIds;
    /**
     * 门店信息
     */
    @ApiModelProperty("门店信息")
    private List<QueryCouponStopBo> stops;

    public QueryCouponBo() {

    }

    public QueryCouponBo(Coupon dto) {

        super(dto);
    }

    @Override
    public BaseBo<Coupon> convert(Coupon dto) {
        return super.convert(dto);
    }

    @Override
    protected void afterInit(Coupon dto) {
        QueryCouponProductVo queryCouponProductVo = new  QueryCouponProductVo();
        queryCouponProductVo.setCouponId(this.getId());
        List<QueryCouponProductBo> queryCouponProductBos = Optional.ofNullable(ApplicationUtil.getBean(CouponProductService.class)
                .queryList(queryCouponProductVo)).orElse(new ArrayList<>());
        this.setProducts(queryCouponProductBos);
        this.setProductIds(queryCouponProductBos.stream().map(QueryCouponProductBo::getProductId).collect(Collectors.toList()));

        QueryCouponStopVo queryCouponStopVo = new  QueryCouponStopVo();
        queryCouponStopVo.setCouponId(this.getId());
        List<QueryCouponStopBo> queryCouponStopBos = Optional.ofNullable(ApplicationUtil.getBean(CouponStopService.class)
                .queryList(queryCouponStopVo)).orElse(new ArrayList<>());
        this.setShopIds(queryCouponStopBos.stream().map(QueryCouponStopBo::getStopId).collect(Collectors.toList()));
        this.setStops(queryCouponStopBos);
    }
}

